package com.onpositive.notes.templates;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import com.onpositive.notes.argumnets.IArgumentsSet;
import com.onpositive.notes.impl.AbstractNoteEntry;
import com.onpositive.notes.model.ITemplate;
import com.onpositive.notes.model.ITemplateArgument;
import com.onpositive.notes.model.ITemplateModel;
import com.onpositive.notes.services.TemplateModelRegistry;

public class BasicTemplate extends AbstractNoteEntry implements ITemplate {

	public BasicTemplate() {
		super();
	}

	private static final long serialVersionUID = 1070958628072676748L;
	
	//private ArrayList<ITemplateArgument<?>> args ;
	private ArrayList<IArgumentsSet> argSets ;
	
	private String modelId ;
	private ArrayList<Integer> modificationData = new ArrayList<Integer>() ;
	
	public BasicTemplate( /*List<ITemplateArgument<?>> args,*/ String modelId ) {
		super(-1,-1) ;
		this.modelId = modelId ;
		//this.args = new ArrayList<ITemplateArgument<?>>(args) ;
	}	

	@Override
	public String getText() {		
		ITemplateModel<BasicTemplate> model = getModel() ;
		if( model == null )
			return null ;

		return model.getText(this) ;
	}
	
	@Override
	public String getText( Locale locale ){
		ITemplateModel<BasicTemplate> model = getModel() ;
		if( model == null )
			return null ;
		
		return model.getText(this,locale) ;
	}

//	@Override
//	public List<ITemplateArgument<?>> getArguments() {
//		return null; //args;
//	}
	
	@Override
	public List<IArgumentsSet> getArgSets() {
		return this.argSets ;
	}

	@Override
	public ITemplateModel<BasicTemplate> getModel() {
		ITemplateModel<?> someModel = TemplateModelRegistry.getInstance().getModelById(modelId);
		if( !(someModel.getSubjectClass() == BasicTemplate.class) )
			return null ;
		
		ITemplateModel<BasicTemplate> model = (ITemplateModel<BasicTemplate>) someModel ;
		return model;
	}
	
	public String toString(){
		
		ITemplateModel<BasicTemplate> model = getModel() ;
		String id = model != null ? model.getId() : "NULL-model";
		
		StringBuffer buf = new StringBuffer(id).append(": ") ;
//		for( ITemplateArgument<?> arg : args )
//			buf.append( arg.toString() ).append(", ") ;
		for( IArgumentsSet set : getArgSets() ) {
			List<ITemplateArgument<?>> args = set.getArgs();
			int size = args.size();
			for( int i = 0 ; i < size ; i++ ){
				ITemplateArgument<?> arg = args.get(i) ;
				buf.append( arg.toString() ) ;
				if( i+1 < size)
					buf.append(", ") ;
				else
					buf.append("; ") ;
			}
		}
		
		String str = buf.toString() ;
		return str.substring(0, str.length()-2) ;
	}

	@Override
	public void setId( int id ) {
		super.setId(id) ;
//		for( ITemplateArgument<?> arg : args )
//			arg.setTemplateId(id) ;
		for( IArgumentsSet set : getArgSets() )
			set.setTemplateId(id) ;
	}

	@Override
	public void apply() {
		ITemplateModel<BasicTemplate> model = this.getModel();
		if( model == null )
			return ;
		
		model.applyTemplate(this) ;
	}

	@Override
	public void cancel() {
		ITemplateModel<BasicTemplate> model = this.getModel();
		if( model == null )
			return ;
		
		model.cancelTemplate(this) ;
	}

	@Override
	public List<Integer> getModificationData() {
		return modificationData ;
	}

	@Override
	public void addArgSet(IArgumentsSet set) {
		if( argSets == null )
			argSets = new ArrayList<IArgumentsSet>() ;
		
		set.setTemplateId(getId()) ;
		argSets.add(set) ;		
	}
}